HDU 1039[Easier Done Than Said?] 字符串处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1039

题目大意:给一个字符串,看是否符合密码的要求。

规则:
1.至少有1个元音字母。
2.不能有3个连续的元音字母或辅音字母
3.不能有相同的字母连续出现(除了ee,oo)

关键思想:耐心地处理字符串

代码如下:

//可优化 
#include <iostream>
#include <algorithm>
#include <string.h> 
using namespace std;
string t;

bool isv(char a){
	return a=='a'||a=='e'||a=='i'||a=='o'||a=='u';
}
bool rule1(char *a){
	return strchr(a,'a')!=NULL||strchr(a,'e')!=NULL||strchr(a,'i')||strchr(a,'o')||strchr(a,'u');
}
bool rule(char *a){
	int b[2]={0,0};//b[0]为连续元音数,b[1]为连续辅音数。
	for(int i=0;i<t.size();i++){
		if(isv(a[i]))b[0]++,b[1]=0;
		else  b[1]++,b[0]=0;
		if(b[0]>=3||b[1]>=3)return false;
		if (i>0)if(a[i-1]==a[i]&&a[i]!='e'&&a[i]!='o'){
			return false;
		}
		else {
		if(i+1<t.size())
			if(a[i-1]==a[i]&&a[i]==a[i+1])return false;
		}
	}
	for(int i=1;i<t.size();i++){

	}
	return true;
}
int main(){
	while(cin>>t&&t!="end"){
		char a[102];
		memset(a,0,sizeof(a));
		strncpy(a,t.c_str(),t.size());//因为后面用到函数要求char *,所以把字符串转化成字符数组。
		if(rule1(a)&&rule(a))
		cout<<"<"<<a<<"> is acceptable."<<endl;
		else cout<<"<"<<a<<"> is not acceptable."<<endl;
	}
	return 0;
}

  

 

posted @ 2017-02-18 23:27  哇咔咔咔  阅读(244)  评论(0编辑  收藏  举报